package java学习.第11章_常用类和基础API;

import org.junit.Test;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;
import java.util.Date;


public class E2_JDK8时间API {
    /**
     * JDK8之前的时间类为啥淘汰了
     *  可变性：时间类应该是不可变得 Date 是可变的
     *  偏移性：Date 中年份是从 1900 便开始的  月份是 0开始
     *  Data无法处理闰秒
     */
    @Test
    public void Data类为啥淘汰() {
        //早已淘汰
        java.util.Date ud1 = new java.util.Date(5, 6, 3);
        System.out.println(new java.sql.Date(ud1.getTime()));//1905-07-03
        System.out.println(ud1);//Mon Jul 03 00:00:00 CST 1905
    }

    /**
     * Java 8吸收了 Java.Time 的精华，  不可变得 final
     * 以一个新的开始为 Java 创建优秀的API。
     * 新的 java.time 中包含了所有关于本地日期(LocalDate)、
     * 本地时间(LocalTime)、本地日期时间(LocalDateTime) 、
     * 时区( ZonedDate Time )和持续时间( Duration) 的类。
     * 历史悠久的Date类新增了toInstant()方法，
     * 用于把Date转换成新的表示形式。这些新增的本地化时间口期API大大简
     * 化了日期时间和本地化的管理。
     */
    @Test
    public void JDK8时间类测试() {
        String d = "2024-08-06";
        TemporalAccessor parse = DateTimeFormatter.ISO_LOCAL_DATE.parse(d);
        LocalDate from = LocalDate.from(parse);
        System.out.println(from);
    }
    @Test
    public void JDK8时间类() {
        System.out.println("---LocalDate.now()---LocalTime.now()--LocalDateTime.now()-------------------------");
        LocalDate localDate=LocalDate.now();//获取当前日期
        LocalTime localTime = LocalTime.now();//获取当前时间
        LocalDateTime localDateTime = LocalDateTime.now();//获取当前日期时间
        System.out.println(localDate);
        System.out.println(localTime);
        System.out.println(localDateTime);
        System.out.println("---LocalDate.of()----LocalTime.of()---LocalDateTime.of()------------------------");
        //没有偏移量  获取指定时间
        LocalDateTime of = LocalDateTime.of(2021, 2, 1, 11, 11, 11, 111);
        System.out.println(localDateTime.getDayOfMonth());//当月第几天
        System.out.println(localDateTime.getNano());//当前纳秒为基础   0.0-1.0秒之间如134000000
        System.out.println(localDateTime.getDayOfWeek());//今天星期几
        System.out.println(localDateTime.getHour());//现在几点
        System.out.println(localDateTime.getMinute());;//现在几分
        System.out.println(localDateTime.getSecond());;//现在几秒
        System.out.println(of.getDayOfYear());//今天是今年的第几天

        //不可变性   返回修改后的时间
        localDateTime.withHour(5);//把时间改成5点   返回修改后的时间  原时间不变

        localDateTime.plusDays(5);//把时间加5天   返回修改后的时间  原时间不变

        localDateTime.minusDays(6);//把时间减5天   返回修改后的时间  原时间不变
    }


    @Test
    public void Instant创建本初子母线时间() {
        System.out.println("----------Instant.now()-----------------");
        Instant instant = Instant.now();//本初子母线时间  标准建筑 伦敦
        System.out.println(instant);//咱属于东八区  小时+8

        System.out.println("-------instant.atOffset(ZoneOffset.ofHours(8))--------------");
        //添加偏移量
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println(offsetDateTime);

        System.out.println("-------.toEpochMilli()--------------");
        //获取自1970年1月1日0时0分0秒（UTC） 开始的毫秒数
        long mi=instant.toEpochMilli();//System.currentTimeMillis()一样
        System.out.println(mi);
        System.out.println(System.currentTimeMillis());

        System.out.println("-------Instant.ofEpochMilli(1629188242558L)--------------");
        Instant instant1=Instant.ofEpochMilli(1629188242558L);//本初子母线时间  标准建筑 伦敦
        System.out.println(instant1);
    }

    @Test
    public void DateTimeFormatter格式转换() {
        System.out.println("-----------------DateTimeFormatter--------------------------------");
        //格式转换
        DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE_TIME;

        LocalDateTime ldt = LocalDateTime.now();//获得当前时间
        System.out.println(ldt);
        //日期--》字符串
        String format = dtf.format(ldt);
        System.out.println(format);

        System.out.println("-----------------TemporalAccessor--------------------------------");
        //字符串--》日期
        TemporalAccessor parse = dtf.parse("2021-08-08T16:26:13.137");//YYYY-MM-DD HH:MM:SS
        System.out.println(parse.toString());
        System.out.println(LocalDateTime.from(parse));//在转回 LocalDateTime

        //格式化
//        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
//        String str = dateTimeFormatter.format(ldt);
//        System.out.println(str);
        System.out.println("-----------------DateTimeFormatter.ofPattern()--------------------------------");
        //自定义格式化      重点
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");// a上下午
        String format1 = df.format(LocalDateTime.now());
        System.out.println(format1);

        //解析
        TemporalAccessor parse1 = df.parse("2021年08月17日 04:46:53");
        System.out.println(parse1);
        //System.out.println(LocalDateTime.from(parse1));//报错  parse1 必须和 LocalDateTime的格式一样
    }



}
